package com.haust.itemparam.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.haust.commons.exception.DaoException;
import com.haust.commons.pojo.HaustResult;
import com.haust.dao.RedisDao;
import com.haust.itemparam.service.ItemParamService;
import com.haust.mapper.TbItemParamMapper;
import com.haust.pojo.TbItemParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;

/**
 * 商品规格服务类型
 */
@Service
public class ItemParamServiceImpl implements ItemParamService {
    @Autowired
    private TbItemParamMapper tbItemParamMapper;

    @Autowired
    private RedisDao redisDao;

    @Value("${Haust.incr.itemParam}")
    private String key;

    /**
     * 查询全部 规格参数
     * 访问数据库 表格是tb_item_param 查询全部数据
     *
     * @return
     */
    @Override
    public HaustResult selectItemParamAll() {
        return HaustResult.ok(tbItemParamMapper.selectList(null));
    }

    @Override
    public HaustResult selectHaveParam(Long itemCatId) {
        //基于itemCatId字段作为条件，count统计数据行数，如果count>0 代表有规格参数，则不能添加规格参数
        //参数是 QueryWrapper
        QueryWrapper<TbItemParam> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("item_cat_id", itemCatId);
        int count = tbItemParamMapper.selectCount(queryWrapper);
        if (count == 0) {
            //说明，没有规格参数，可以给该商品分类添加规格参数
            return HaustResult.ok();
        }

        return HaustResult.error("已经有规格参数，不能再次添加！");
    }

    /**
     * 在分布式项目中，除特殊标记主键自增外，都需要手动赋值
     * 新增规格参数 ，注意事务的管理
     *
     * @param tbItemParam 新增数据
     * @return
     */
    @Override
    @Transactional(rollbackFor = DaoException.class)
    public HaustResult insertItemParam(TbItemParam tbItemParam) {

        //从redis获取自增主键
        Long incr = null;
        try {
            incr = redisDao.incr(key);
        } catch (Exception e) {
            return HaustResult.error("服务器忙，请稍后重试！");
        }

        tbItemParam.setId(incr);
        Date date = new Date();
        tbItemParam.setCreated(date);
        tbItemParam.setUpdated(date);


        try {
            //数据库访问可能发生错误，如：网络问题，sql错误，主键冲突，数据不完整
            //异常发生，事务回滚，必须处理后在传递异常
            tbItemParamMapper.insert(tbItemParam);
        } catch (RuntimeException e) {
            e.printStackTrace();
            //抛出异常之前：
            //可以记录日志，可以提供修改错误的帮助
            //调用其他代码，实现数据的缓存
            throw new DaoException("网络故障，请稍后再试！");
        }


        return HaustResult.ok();
    }

    @Override
    @Transactional(rollbackFor = DaoException.class)
    public HaustResult deleteItemParamById(Long id) {
        /**
         * 根据 规格Id,删除规格参数
         * @param id 规格参数Id
         * @return
         */
        QueryWrapper<TbItemParam> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("id", id);

        try {
            tbItemParamMapper.delete(queryWrapper);
        } catch (RuntimeException e) {
            //一些处理,或日志记录
            throw new DaoException("服务繁忙，请稍后再试！");
        }
        return HaustResult.ok();
    }

    /**
     * 根据商品分类主键，查询规格参数
     *
     * @param itemCatId 分类Id
     * @return
     */
    @Override
    public HaustResult selectItemParamByItemCatId(Long itemCatId) {
        //条件查询唯一数据
        //数据不存在，返回null
        //数据唯一，返回对象
        //数据行数大于1，抛出异常
        QueryWrapper<TbItemParam> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("item_cat_id", itemCatId);

        TbItemParam tbItemParam = tbItemParamMapper.selectOne(queryWrapper);

        if (tbItemParam == null) {
            return HaustResult.error("该商品分类不存在规格参数，请先添加规格参数！");
        }

        return HaustResult.ok(tbItemParam);
    }

}
